package org.gdpu.util.fileConverter;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * 把pdf转化为swf文件
 */
public class ConvertToSwf {
    private Logger logger = LogManager.getLogger(ConvertToSwf.class.getName());
    /**
     * 支持转换的格式
     */
    private final String CONVERT_FILE_TYPE = "pdf";

    /**
     * swftools工具安装目录
     */
    private static String swftoolsPath = "D:\\software\\swftools";

    /**
     * 把pdf格式文件转化为swf格式
     *
     * @param sourceFilePath 要进行转化为swf文件的地址
     * @param swfFilePath    转化后的swf的文件地址
     * @return 是否转换成功
     */
    public boolean convertFileToSwf(String sourceFilePath, String swfFilePath) {
        String fileType = FileUtils.getFileSufix(sourceFilePath);
        File sourceFile = new File(sourceFilePath);
        File swfFile = new File(swfFilePath);

        logger.trace("开始转化文件到swf格式");
        // 判读上传文件类型是否符合转换为pdf
        logger.trace("判断文件类型通过");
        if (!CONVERT_FILE_TYPE.contains(fileType.toLowerCase())) {
            if (logger.isWarnEnabled()) {
                logger.warn("当前文件不符合要转化为SWF的文件类型！");
            }
            return false;
        }

        if (!sourceFile.exists()) {
            if (logger.isWarnEnabled()) {
                logger.warn("要转化为swf的文件不存在！");
            }
            return false;
        }

        logger.trace("准备转换的文件路径存在");
        if (!swftoolsPath.endsWith(File.separator)) {
            swftoolsPath += File.separator;
        }
        if (!swfFile.getParentFile().exists()) {
            swfFile.getParentFile().mkdirs();
        }

        List<String> command = new ArrayList<String>();
        command.add(swftoolsPath + "\\" + fileType.toLowerCase() + "2swf.exe");//从配置文件里读取
        command.add("-z");
        command.add("-s");
        command.add("flashversion=9");
        command.add("-s");
        //加入poly2bitmap的目的是为了防止出现大文件或图形过多的文件转换时的出错，没有生成swf文件的异常
        command.add("poly2bitmap");
        command.add(sourceFilePath);
        command.add("-o");
        command.add(swfFilePath);
        try {
            ProcessBuilder processBuilder = new ProcessBuilder();
            processBuilder.command(command);
            Process process = processBuilder.start();
            logger.trace("开始生成swf文件..");
            dealWith(process);
            try {
                //等待子进程的结束，子进程就是系统调用文件转换这个新进程
                process.waitFor();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            File swf = new File(swfFilePath);
            if (!swf.exists()) {
                return false;
            }
            logger.trace("转化SWF文件成功!");
        } catch (IOException e) {
            logger.error("转化为SWF文件失败!");
            logger.error(e);
            return false;
        }

        return true;
    }

    /**
     * 把pdf格式文件转化为swf格式
     *
     * @param sourceFilePath 要进行转化为swf文件的地址
     * @return 是否转换成功
     */
    public boolean convertFileToSwf(String sourceFilePath) {
        String swfFile = FileUtils.getFilePrefix(sourceFilePath) + ".swf";
        return convertFileToSwf(sourceFilePath, swfFile);
    }

    /**
     * 处理堵塞的情况
     *
     * @param pro 进程
     */
    private void dealWith(final Process pro) {
        try {
            new Thread() {
                public void run() {
                    BufferedReader br1 = new BufferedReader(new InputStreamReader(pro.getInputStream()));
                    String text;
                    try {
                        while ((text = br1.readLine()) != null) {
                            logger.warn(text);
                        }
                    } catch (IOException e) {
                        logger.error(e);
                    }
                }
            }.start();
        } catch (Exception e) {
            logger.error(e);
        }

        try {
            new Thread() {
                public void run() {
                    BufferedReader br2 = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
                    //不要忘记处理出理时产生的信息，不然会堵塞不前的
                    String text;
                    try {
                        while ((text = br2.readLine()) != null) {
                            logger.error(text);
                        }
                    } catch (IOException e) {
                        logger.error(e);
                    }
                }
            }.start();
        } catch (Exception e) {
            logger.error(e);
        }
    }
}
